/*
 * signals.c
 *
 *  Created on: 29/11/2011
 *      Author: utn_so
 */

#include "signal.h"
#include "constantes.h"
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include "archivos_abiertos.h"
#include <time.h>
#include "estaticas.h"
#include "estructuras.h"
#include "iniciarFat.h"

void flushToFile(){

	/*
	 * Se llama a la función al generarse la señal SIGUSR1
	 * Recorre la lista de archivos abiertos y para cada cache,
	 * se genera un archivo de volcado de memoria "CacheFlushFile.txt"
	 */

	if (config.iTamCache == 0)
	{
		log_info(log,"CACHE", "No puede crearse el volcado de Cache: Cache Desactivada");
		return;
	}

	FILE *cacheFile;
	struct nodoListaArchivosAbiertos *archivosAbiertosAux;

	if ( (cacheFile = fopen(CACHEFLUSHFILE, "a+")) == NULL )
	{
			log_info(log,"CACHE", "No puede crearse el volcado de Cache: No se pudo abrir el archivo");
			return;
	}


	pthread_mutex_lock(&mutexArchivosAbiertos);

//
	archivosAbiertosAux = archivosAbiertos;
//
	while(archivosAbiertosAux !=NULL)
	{

//		//mientras haya nodos, tenemos que recorrer la Cache de estos nodos

	    time_t tiempo = time(0);
	    struct tm *tlocal = localtime(&tiempo);

		struct nodoDeCache * nodoAuxiliar;

		fprintf(cacheFile,"\n---------------------------------------------------------\n\n");
		fprintf(cacheFile,"Timestamp: %s  \n\n", asctime(tlocal));

		fprintf(cacheFile,"Archivo: %s  \n\n", archivosAbiertosAux->path );

		fprintf(cacheFile, "Tamaño de Bloque de Cache: 1kb\n\n");

		uint32_t numeroDeNodo =1;


		pthread_mutex_lock(&archivosAbiertosAux->cache->mutexCacheArchivo);
		nodoAuxiliar = archivosAbiertosAux->cache->nodoInicial;


		while(nodoAuxiliar!=NULL)
		{

			fprintf(cacheFile, "\n\nContenido de Bloque de Cache %d:", numeroDeNodo);
			fprintf(cacheFile,"Archivo: %s  \n\n",archivosAbiertosAux->path);
//
//			//Escribo en el archivo

			fwrite(nodoAuxiliar->contenido, 1, TAMANO_BLOQUE, cacheFile);


			// FIN: Escribir Archivo
//
			nodoAuxiliar = nodoAuxiliar->siguiente;
			numeroDeNodo++;

		}
		pthread_mutex_unlock(&archivosAbiertosAux->cache->mutexCacheArchivo);
		archivosAbiertosAux = archivosAbiertosAux->sgte;
	}

	pthread_mutex_unlock(&mutexArchivosAbiertos);

	log_info(log,"CACHE", "Volcado de la memoria cache");

	fclose(cacheFile);

}


